package comum;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;


/**
 * Classe de referencia para tratamento de dados na parte local
 * @author gbomfim
 *
 */
/**
 * @author gbomfim
 *
 */
/**
 * @author gbomfim
 *
 */
/**
 * @author gbomfim
 *
 */
public class ListaArquivo {

	/**
	 * Listo os arquivos do path corrente
	 * @param path
	 * @return ArrayList<String> de arquivos
	 */
	public ArrayList<String> listaArquivos(String path) {

		File dir = new File(path);

		if (!dir.isDirectory()) {
			System.out.println("No directory provided");
			return null;
		}

		ArrayList<String> arrArquivos = new ArrayList<String>();

		File[] files = dir.listFiles();

		FileFilter fileFilter = new FileFilter() {
			public boolean accept(File file) {
				return !file.isDirectory();
			}
		};

		files = dir.listFiles(fileFilter);

		for (File file : files) {
			if (!file.isHidden())
				arrArquivos.add(file.getName());
		}

		return arrArquivos;
	}

	/**
	 * Listo as pastas do path corrente
	 * @param path
	 * @return ArrayList<String> de pastas
	 */
	public ArrayList<String> listaPastas(String path) {

		File dir = new File(path);

		if (!dir.isDirectory()) {
			System.out.println("No directory provided");
			return null;
		}

		ArrayList<String> arrPastas = new ArrayList<String>();

		File[] files = dir.listFiles();

		FileFilter fileFilter = new FileFilter() {
			public boolean accept(File file) {
				return file.isDirectory();
			}
		};
		files = dir.listFiles(fileFilter);

		for (File file : files) {
			arrPastas.add(file.getName());
		}
		return arrPastas;
	}

	/**
	 * Listo os arquivos do path com a extensao passada
	 * @param path
	 * @param ext
	 * @return ArrayList<String> de arquivos
	 * @throws IOException
	 */
	public ArrayList<String> listaArquivosPorExtensao(String path, String ext)
			throws IOException {

		File dir = new File(path);

		if (!dir.isDirectory()) {
			System.out.println("No directory provided");
			return null;
		}

		ArrayList<String> arrArquivos = new ArrayList<String>();

		File[] files = dir.listFiles();

		FileFilter fileFilter = new FileFilter() {
			public boolean accept(File file) {
				return !file.isDirectory();
			}
		};

		files = dir.listFiles(fileFilter);

		for (File file : files) {
			if (!file.isHidden() && getExtension(file).equalsIgnoreCase(ext))
				arrArquivos.add(file.getName());
		}

		return arrArquivos;
	}
	
	/**
	 * Listo todas as extensoes do path passado
	 * @param path
	 * @return ArrayList<String> arrayList de Extensoes
	 * @throws IOException
	 */
	public ArrayList<String> listaExtensoesPorPasta(String path)
			throws IOException {

		File dir = new File(path);

		if (!dir.isDirectory()) {
			System.out.println("No directory provided");
			return null;
		}

		ArrayList<String> arrArquivos = new ArrayList<String>();

		File[] files = dir.listFiles();

		FileFilter fileFilter = new FileFilter() {
			public boolean accept(File file) {
				return !file.isDirectory();
			}
		};

		files = dir.listFiles(fileFilter);

		for (File file : files) {
			String ext = "." + getExtension(file);
			if (!file.isHidden() && (arrArquivos.indexOf(ext) == -1) && !ext.equalsIgnoreCase( "."))
				arrArquivos.add(ext);
		}

		return arrArquivos;
	}

	/**
	 * Metodo utilitario para pegar a extensao do arquivo
	 * @param f
	 * @return String extensao
	 */
	public static String getExtension(File f) {
		String ext = null;
		String s = f.getName();
		int i = s.lastIndexOf('.');

		if (i > 0 && i < s.length() - 1)
			ext = s.substring(i + 1).toLowerCase();

		if (ext == null)
			return "";

		return ext;
	}

	/**
	 * Pego as informacoes do aquivo
	 * @param path
	 * @return 
	 */
	public InfoArquivo getInfoArquivo(String path) {

		File file = new File(path);

		InfoArquivo info = new InfoArquivo();

		info.setUltimaMod(new Date(file.lastModified()));
		info.setTamanho(file.length());

		return info;
	}

	/**
	 * Deleto o arquivo do path passado
	 * @param path
	 */
	public void deleteArquivo(String path) {

		File file = new File(path);

		System.out.println(file.delete());
	}

	/**
	 * Renomeio o arquivo do path passado para o novo nome no respectivo path passado
	 * @param path
	 * @param newName
	 */
	public void renameArquivo(String path, String newName) {
		File file = new File(path);
		File file2 = new File(newName);

		// Rename file (or directory)
		boolean success = file.renameTo(file2);
		if (!success) {
			System.out.println("Erro ao renomear");
		}
	}

	public String listaArquivosString(String path) {
		ArrayList<String> listagem = this.listaArquivos(path);
		String lista = "";
		Iterator<String> iterator = listagem.iterator();
		while (iterator.hasNext()) {
			String element = iterator.next();
			lista += element + "\n";
		}
		return lista;
	}

	public String listaPastasString(String path) {
		ArrayList<String> folders = this.listaPastas(path);
		Iterator<String> iterator = folders.iterator();

		String text = "";

		while (iterator.hasNext()) {
			String element = iterator.next();
			text += element + "\n";
		}
		return text;
	}
}
